
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "bsp_usart0.h"
#include "bsp_timer8.h"
#include "bsp_timer5.h"
#include "APP.h"
#include "FreeRTOS.h"
#include "task.h"

//任务引用
TaskHandle_t startHandler;
TaskHandle_t balanceTaskHandler;
TaskHandle_t inputTaskHandler;
TaskHandle_t showTaskHandler;
TaskHandle_t send_cur_TaskHandler;
TaskHandle_t App_Protocal_send_pid_TaskHandler;
TaskHandle_t App_Protocol_pase_TaskHandler;

BaseType_t result;

//所有的初始化
static void sys_init(){
  //USART0初始化
	bsp_usart0_init(115200);
	//初始化timer5
	bsp_timer5_init();
	//初始timer8
	timer8_init();
	//初始化IIC0
	bsp_iic0_init();
	
	//初始化App_Balance业务
	App_balance_init();
	//App_Input业务
	App_input_init();
	//App_Protocol业务
	App_Protocal_init();
	//App_Show业务
	App_Show_init();
	printf("app_start\n");
}
//第一个task
void startTask(void *pvParameters) {
	//初始化外设
	sys_init();
	//创建其它任务
	//平衡球任务
	result = xTaskCreate(App_balance_task,//任务函数
							"App_balance_task",//任务名字
							128,  //任务申请的栈内存大小  128*4 = 512byte
							NULL, //任务参数
							2,    //中断优先级: 0:大  1:小
							&balanceTaskHandler);//任务的引用,后续可以通过这个引用操作任务
	//按键任务
		result = xTaskCreate(App_input_task,//任务函数
							"App_input_task",//任务名字
							128,  //任务申请的栈内存大小  128*4 = 512byte
							NULL, //任务参数
							2,    //中断优先级: 0:大  1:小
							&inputTaskHandler);//任务的引用,后续可以通过这个引用操作任务
	//显示任务
		result = xTaskCreate(App_Show_task,//任务函数
							"App_show_task",//任务名字
							128,  //任务申请的栈内存大小  128*4 = 512byte
							NULL, //任务参数
							2,    //中断优先级: 0:大  1:小
							&showTaskHandler);//任务的引用,后续可以通过这个引用操作任务
	//协议任务，发送当前位置
		result = xTaskCreate(App_Protocal_send_cur_task,//任务函数
							"App_Protocal_send_cur_task",//任务名字
							128,  //任务申请的栈内存大小  128*4 = 512byte
							NULL, //任务参数
							2,    //中断优先级: 0:大  1:小
							&send_cur_TaskHandler);//任务的引用,后续可以通过这个引用操作任务
	//协议任务，发送使用的pid
		result = xTaskCreate(App_Protocal_send_pid_task,//任务函数
							"App_Protocal_send_pid_task",//任务名字
							128,  //任务申请的栈内存大小  128*4 = 512byte
							NULL, //任务参数
							2,    //中断优先级: 0:大  1:小
							&App_Protocal_send_pid_TaskHandler);//任务的引用,后续可以通过这个引用操作任
	////解析协议内容
		result = xTaskCreate(App_Protocol_pase_Task,//任务函数
							"App_Protocol_pase_Task",//任务名字
							128,  //任务申请的栈内存大小  128*4 = 512byte
							NULL, //任务参数
							0,    //中断优先级: 0:大  1:小
							&App_Protocol_pase_TaskHandler);//任务的引用,后续可以通过这个引用操作任务
							
	//销毁自己
	vTaskDelete(NULL);
}
int main(void)
{
	//优先级分组
	nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
	//系统滴答时钟初始化
  //systick_config();
	
	printf("app_start\n");
		//创建task1 初始化
		result = xTaskCreate(startTask,
							"vTask1",
							128,  
							NULL, 
							1,    
							&startHandler);
	//开始调度任务
	vTaskStartScheduler();
	//调度之后的代码执行说明程序有问题

}
